\documentclass[a4paper]{article}

\input{style/ch_xelatex.tex}
\input{style/scala.tex}

\lstset{frame=, basicstyle={\footnotesize\ttfamily}}
% 加载宏包
\usepackage{xcolor}
\usepackage{listings}
\usepackage{caption}

% 定义代码样式
\lstset{
    language={[LaTeX]TeX},           % 语言设为 LaTeX
    basicstyle=\ttfamily\small,      % 字体：等宽，小号
    backgroundcolor=\color{gray!5},  % 背景色：极浅灰
    frame=single,                    % 添加单线边框
    framesep=8pt,                    % 边框与代码的间距
    rulecolor=\color{gray!30},       % 边框颜色
    breaklines=true,                 % 自动换行
    tabsize=2,                       % Tab 宽度
    numbers=left,                    % 行号在左侧
    numberstyle=\tiny\color{gray},   % 行号样式
    captionpos=b,                    % 标题在底部
    keywordstyle=\color{blue!70!black},
    commentstyle=\color{green!60!black},
    stringstyle=\color{red}
}

\graphicspath{ {images/} }
\usepackage{ctex}
%-----------------------------------------BEGIN DOC----------------------------------------
% ... （前面的导言区代码保持不变） ...

\begin{document}
\renewcommand{\contentsname}{目\ 录}
\renewcommand{\appendixname}{附录}
\renewcommand{\appendixpagename}{附录}
\renewcommand{\refname}{参考文献}
\renewcommand{\figurename}{图}
\renewcommand{\tablename}{表}
\renewcommand{\today}{\number\year 年 \number\month 月 \number\day 日}

\title{{\Huge 系统开发工具基础 实验报告{\large\linebreak\\}}{\Large 实验一、latex和git实践\linebreak\linebreak}}
%please write your name, Student #, and Class # in Authors, student ID, and class # respectively
\author{\\姓\ 名:操\ 淳\\
学\ 号: 23020007002\\
班\ 号: 23级软件工程\\\\
系统开发工具基础\\
(夏季, 2025)\\\\
中国海洋大学\\
软件工程学院\\
}
\date{\today}
\maketitle
\thispagestyle{empty}

\newpage


%-----------------------------------------CONTENT-------------------------------------
\begin{center}
\tableofcontents\label{c}
\end{center}
\thispagestyle{empty} % <<< 添加这行：让目录页没有页码
% 注意：\tableofcontents 通常会生成多页，上面这行只对当前页有效。
% 如果目录只有一页，这样就够了。如果目录有多页，需要对后续页也设置。

% --- 关键步骤：从这里开始设置页码 ---
\clearpage % 确保在新页开始
\pagenumbering{arabic} % <<< 添加这行：将页码格式改为阿拉伯数字，并从 1 开始计数
\setcounter{page}{1}    % <<< 添加这行：显式设置当前页（正文第一页）为第 1 页
% （虽然 \pagenumbering{arabic} 通常会重置计数器，但显式设置更保险）

% 从现在开始的所有页面将使用默认页码样式（通常页脚居中）
% 如果你之前用了 fancyhdr 并希望正文页码居中，确保默认样式是合适的
% 或者在这里重新设置 fancyhdr 样式

%------------------------------------------TEXT--------------------------------------------

%----------------------------------------OVERVIEW-----------------------------------------

\section*{概述}

本实验报告旨在记录和总结“系统开发工具基础”课程中关于 \LaTeX{} 和 Git 的实践内容。报告分为两个主要部分，详细阐述了这两款工具的基本操作和应用场景。

\subsection*{第一部分：\LaTeX{} 实例}
本部分首先介绍了 \LaTeX{} 文档的基础构成，包括 \texttt{\textbackslash documentclass} 和 \texttt{\textbackslash begin\{document\}}。接着，详细演示了如何通过一系列命令来构建和美化文档：
\begin{itemize}
    \item \textbf{文档标题与作者信息}：使用 \texttt{\textbackslash title}, \texttt{\textbackslash author}, \texttt{\textbackslash date} 和 \texttt{\textbackslash maketitle} 命令创建报告封面。
    \item \textbf{章节结构}：利用 \texttt{\textbackslash section}, \texttt{\textbackslash subsection}, \texttt{\textbackslash subsubsection} 等命令对文档进行层次化组织。
    \item \textbf{标签与引用}：通过 \texttt{\textbackslash label} 和 \texttt{\textbackslash ref} / \texttt{\textbackslash pageref} 实现文档内部的交叉引用。
    \item \textbf{目录生成}：使用 \texttt{\textbackslash tableofcontents} 自动生成目录，并展示了 \texttt{\textbackslash pagenumbering} 调整页码格式的方法。
    \item \textbf{中文字体支持}：强调了 \texttt{\textbackslash usepackage\{ctex\}} 在 \LaTeX{} 中文排版中的重要性，并对比了使用与不使用 ctex 包的效果。
    \item \textbf{字体样式与大小}：介绍了 \texttt{\textbackslash color} 和 \texttt{\textbackslash colorbox} 实现彩色字体和背景，以及 \texttt{\textbackslash tiny}, \texttt{\textbackslash small}, \texttt{\textbackslash large} 等命令调整字体大小。
    \item \textbf{段落缩进与列表}：讲解了 \texttt{\textbackslash noindent} 和 \texttt{\textbackslash setlength\{\textbackslash parindent\}\{0pt\}} 控制段落缩进，并展示了有序列表 (\texttt{enumerate}) 和无序列表 (\texttt{itemize}) 的创建。
    \item \textbf{表格创建}：通过 \texttt{\textbackslash begin\{tabular\}} 环境，学习了如何定义表格列的对齐方式、添加竖线和横线，并进行数据输入。
\end{itemize}

\subsection*{第二部分：Git 实例}
本部分专注于 Git 版本控制系统的实践，涵盖了从仓库操作到分支管理的核心功能：
\begin{itemize}
    \item \textbf{历史信息探索}：演示了如何使用 \texttt{git log} 查看提交历史，\texttt{git show} 查看特定提交的详细信息，以及 \texttt{git blame} 追溯文件行的修改者。
    \item \textbf{文件操作与版本控制}：实践了如何创建、提交文件 (\texttt{echo > file.txt}, \texttt{git add}, \texttt{git commit})，并学习了如何通过 \texttt{git filter-repo} 将敏感文件从历史中彻底删除。
    \item \textbf{暂存管理}：介绍了 \texttt{git stash} 的用法，包括保存和恢复工作区修改，以及其在紧急修复和上下文切换中的应用。
    \item \textbf{自定义快捷命令}：展示了如何通过编辑 \texttt{.gitconfig} 文件创建 Git 别名（例如 \texttt{git graph}），以简化常用命令。
    \item \textbf{仓库初始化与克隆}：区分了 \texttt{git init} (初始化新仓库) 和 \texttt{git clone} (克隆现有仓库) 的用法，并展示了克隆远程仓库的操作。
    \item \textbf{暂存更改}：详细讲解了 \texttt{git add} 命令，包括添加单个文件和添加所有修改到暂存区。
    \item \textbf{创建快照}：解释了 \texttt{git commit} 如何创建永久快照，并记录提交信息。
    \item \textbf{检查状态}：使用 \texttt{git status} 检查工作区和暂存区的状态。
    \item \textbf{分支管理}：学习了 \texttt{git branch} 创建分支，\texttt{git checkout} / \texttt{git switch} 切换分支，以及 \texttt{git merge} 合并分支的操作，强调了分支在并行开发中的作用。
    \item \textbf{查看差异}：通过 \texttt{git diff}, \texttt{git diff --cached}, \texttt{git diff HEAD\textasciitilde1 HEAD}, \texttt{git diff branch1..branch2} 等命令，深入理解了如何查看不同状态和分支之间的代码差异。
\end{itemize}

本报告的 \LaTeX{} 编写文件已上传至 Gitee 仓库，方便查阅和复用。您可以在以下地址找到：\\
https://gitee.com/HELLO-050601/system-development.git

%----------------------------------latex部分------------------------------------------

\newpage
\section{\LaTeX{}实例} \label{文档标题}%------------------------------
\subsection{添加文档标题}\label{sub:添加标题}
在给我们的文档添加标题之前我们应该要先了解\LaTeX{}的基本要素，也就是
\texttt{\textbackslash documentclass[..]\{..\}}
其中\{..\}中指定了文档的类型，如article，proc，book等，而[..]中则设置了文档的一些参数，如字体大小，纸张大小等。
\texttt{\textbackslash begin\{document\}} 和
\texttt{\textbackslash end\{document\}} 命令将你的文本内容包裹起来。任何在 \texttt{\textbackslash begin\{document\}} 之前的文本都被视为前导命令，会影响整个文档。任何在 \texttt{\textbackslash end\{document\}} 之后的文本都会被忽视。所以一个标准的latex文档格式如下：
\begin{lstlisting}[caption={一个简单的 \LaTeX{}文档}]
\documentclass[a4paper, 12pt]{article}

\begin{document}
这是一段文本
\end{document}
\end{lstlisting}

接下来就开始给我们的文档添加标题。我们这里要学习的第一个命令就是
\texttt{\textbackslash maketitle},他可以给文档创建标题。我们需要指定文档的标题，日期如果没有指定则会使用现在的日期，作者则是可以选择的.但是由于\LaTeX{}原生不支持中文，所以我们需要使用
\texttt{\textbackslash usepackage\{ctex\}}
然后加上上一段的内容，我们的文档就变成了如下的格式：
\begin{lstlisting}[caption={添加文档标题}]
\documentclass[a4paper, 12pt]{article}
\usepackage{ctex}

\begin{document}
  \title{系统开发工具基础}
  \author{操淳}
  \date{\today}
  \maketitle

  这是一段文字
\end{document}

\end{lstlisting}

效果如图\ref{fig:add_title}：
\begin{figure}
    \centering
    \includegraphics[width=0.8\linewidth]{images/add_title.png}
    \caption{添加文档标题}
    \label{fig:add_title}
\end{figure}

\subsection{章节}\label{sub:章节}
如果我们想要把我们的文档分为章（chatpers）、节(sections)和小节（subsections），我们可以使用下面的这些适用于
\textbf{article}类型文档的命令：
\begin{itemize}
    \item \texttt{\textbackslash section\{...\}}
    \item \texttt{\textbackslash subsection\{...\}}
    \item \texttt{\textbackslash subsubsection\{...\}}
    \item \texttt{\textbackslash paragraph\{...\}}
    \item \texttt{\textbackslash subparagraph\{...\}}
\end{itemize}
在\textbf{\textbf{\{...\}}}中的文本则表示这个章节的标题。

文档格式如下：
\begin{lstlisting}[caption={章节表示}]
  \section{第一章}
  这是一章
  \subsection{节}
  这是一节
  \subsubsection{小节}
  这是一个小节
  \paragraph{段落}
  这是一个段落
  \subparagraph{小段落}
  这是一个小段落
·\section{第二章}
  这是一章
  \subsection{节}
  这是一节
  \subsubsection{小节}
  这是一个小节
  \paragraph{段落}
  这是一个段落
  \subparagraph{小段落}
  这是一个小段落
  
\end{lstlisting}

效果如图\ref{fig:chatper}：
\begin{figure}[H]
    \centering
    \includegraphics[width=0.8\linewidth]{images/chatper.png}
    \caption{章节表示}
    \label{fig:chatper}
\end{figure}

\subsection{创建标签}\label{sub:标签}
我们可以给任意的章节命令创建标签，这样他们就可以在文档的其他部分被引用。使用\texttt{\textbackslash label\{labelname\}}来对章节创建标签。与之相对的，我们可以使用\texttt{\textbackslash ref\{labelname\}}或者
\texttt{\textbackslash pageref\{labelname\}}来引用对应的章节。
文档格式如下：
\begin{lstlisting}[caption={创建标签}]
\documentclass[a4paper, 12pt]{article}
\usepackage{ctex}

\begin{document}
  \title{系统开发工具基础}
  \author{操淳}
  \date{\today}
  \maketitle

  \section{介绍}
  这是一个介绍.

  \section{方法}

  \subsection{第一段}
  \label{第一段} 方法章节的第一段

  \subsection{第二段}
  方法章节的第二段

  \section{结果}
  下面是我的结果. 引用 section \ref{第一段} 在页 \pageref{第一段}
\end{document}
\end{lstlisting}
效果如图\ref{fig:refer}：
\begin{figure}[H]
    \centering
    \includegraphics[width=0.8\linewidth]{images/refer.png}
    \caption{创建标签}
    \label{fig:refer}
\end{figure}

\subsection{生成目录}\label{sub:生成目录}
如果我们使用了分节命令，那么很容易得生成一个目录。我们可以使用\texttt{\textbackslash tableofcontents}在文档中生成一个目录，通常在标题的后面建立目录。

此外我们如果想要更改页码为罗马数字（i,ii,iii）。这可以确保文档从正文的第一页开始。页码可以使用\texttt{\textbackslash pagenumbering\{...\}}在阿拉伯和罗马之间切换。

我们可以在\texttt{\textbackslash maketitle}后面输入下面的内容
\begin{lstlisting}
\pagenumbering{roman}
\tableofcontents
\newpage
\pagenumbering{arabic}
\end{lstlisting}
接下来我们看一下对比:
\begin{figure}[H]
    \centering
    \includegraphics[width=0.8\linewidth]{images/code_pagenu.png}
    \caption{页码代码}
    \label{fig:页码代码}
\end{figure}

\begin{figure}[H]
    \centering
    \includegraphics[width=0.5\linewidth]{images/result_arabic.png}
    \caption{阿拉伯数字}
    \label{fig:阿拉伯数字}
\end{figure}

\begin{figure}[H]
    \centering
    \includegraphics[width=0.5\linewidth]{images/result_roman.png}
    \caption{罗马数字}
    \label{fig:罗马数字}
\end{figure}

我们可以看到在图\ref{fig:阿拉伯数字}中页码是我们常用的阿拉伯数字，并且页码是1，在图\ref{fig:罗马数字}中页码则是罗马数字，并且是重新开始的，没有接着上一页的页码。

接着我们看一下
\texttt{\textbackslash pagenumbering}命令的效果：

\begin{figure}[H]
    \centering
    \includegraphics[width=0.5\linewidth]{images/pagenumbering.png}
    \caption{\textbackslash pagenumbering的效果}
    \label{fig:pagenumbering}
\end{figure}

\subsection{中文字体支持}
在前面我们就提到了我们需要使用额外的宏包来保证我们的文档能够正常显示中文，也就是在文档的前导命令中添加：
\begin{lstlisting}
    \usepackage[UTF8]{ctex}
\end{lstlisting}
同时我们还需要将我们的编译器换成\texttt{xelatex}命令，因为它是支持中文的。
有无\texttt{\textbackslash usepackage{ctex}}效果对比：
\begin{figure}
    \centering
    \includegraphics[width=0.8\linewidth]{images/noctex.png}
    \caption{没有使用ctex}
    \label{fig:noctex}
\end{figure}

\begin{figure}
    \centering
    \includegraphics[width=0.8\linewidth]{images/ctex.png}
    \caption{使用了ctex}
    \label{fig:ctex}
\end{figure}

我们很显然的发现了图\ref{fig:noctex}并没有显示中文内容

\subsection{彩色字体}
为了让我们的文档支持彩色字体，我们需要使用\texttt{\textbackslash usepackage\{color\}}来调用我们常见的颜色。如下
\begin{lstlisting}
    {\color{red}红色}\\
    {\color{blue}蓝色}\\
    {\color{green}绿色}\\
    {\colorbox{red}红色文字背景}\\
    {\colorbox{blue}蓝色文字背景}\\
\end{lstlisting}

效果如图\ref{fig:字体颜色}：
\begin{figure}[H]
    \centering
    \includegraphics[width=0.8\linewidth]{images/color.png}
    \caption{字体和字体背景颜色}
    \label{fig:字体颜色}
\end{figure}

我们可以使用
\texttt{\{\textbackslash color\{字体颜色\}任意文本\}}来改变字体的颜色，同时我们看到图
\ref{fig:字体颜色}的后两个实例有颜色背景，我们同样可以使用
\texttt{\{\textbackslash colorbox\{背景颜色\}任意文本\}}来达到这样的效果。

\subsection{字体大小}
接下来我们列举一些\LaTeX{}常用的字体大小设定命令：
\begin{lstlisting}
normal size words\\
{\tiny tiny words}\\
{\scriptsize scriptsize words}\\
{\footnotesize footnotesize words}\\
{\small small words}\\
{\large large words}\\
{\Large Large words} \\
{\LARGE LARGE words}\\
{\huge huge words}
    
\end{lstlisting}

效果如图\ref{fig:字体大小}：
\begin{figure}[H]
    \centering
    \includegraphics[width=0.8\linewidth]{images/wordsize.png}
    \caption{字体大小}
    \label{fig:字体大小}
\end{figure}

\subsection{段落缩进}
\LaTeX{}默认每个章节的第一段首行顶格，之后的段落首行缩进。如果我们想要某一个段落顶格，那么我们在需要顶格的段落前面加上
\texttt{\textbackslash noindent}命令即可。如果我们想要全局的段落顶格，那么在文档的某一个位置使用\texttt{\textbackslash setlength\{\textbackslash parindent\}\{0pt\}}即可，之后所有的段落都会顶格。\\
效果如图\ref{fig:段落正常}、\ref{fig:部分段落顶格}、\ref{fig:全部段落正常}和\ref{fig:全部段落顶格}所示：

\begin{figure}[htbp]
    \centering
    % 左边图片
    \begin{minipage}[t]{0.48\linewidth}
        \centering
        \includegraphics[width=\linewidth]{images/段落正常.png} % 替换为你的图片路径
        \captionof{figure}{段落正常}
        \label{fig:段落正常}
    \end{minipage}
    \hfill % 在两个 minipage 之间添加弹性间距
    % 右边图片
    \begin{minipage}[t]{0.48\linewidth}
        \centering
        \includegraphics[width=\linewidth]{images/部分段落顶格.png} % 替换为你的图片路径
        \captionof{figure}{部分段落顶格}
        \label{fig:部分段落顶格}
    \end{minipage}
    \label{fig:both}
\end{figure}

\begin{figure}[htbp]
    \centering
    % 左边图片
    \begin{minipage}[t]{0.48\linewidth}
        \centering
        \includegraphics[width=\linewidth]{images/全部段落正常.png} % 替换为你的图片路径
        \captionof{figure}{全部段落正常}
        \label{fig:全部段落正常}
    \end{minipage}
    \hfill % 在两个 minipage 之间添加弹性间距
    % 右边图片
    \begin{minipage}[t]{0.48\linewidth}
        \centering
        \includegraphics[width=\linewidth]{images/全部段落顶格.png} % 替换为你的图片路径
        \captionof{figure}{全部段落顶格}
        \label{fig:全部段落顶格}
    \end{minipage}
    \label{fig:both}
\end{figure}

\subsection{列表}
\LaTeX{}支持两种类型的列表：\texttt{有序列表}和\texttt{无序列表}。列表中的元素定义为\texttt{\textbackslash item}。列表可以有子列表。示例如下（生成一个有序列表套无序列表）：
\begin{lstlisting}
\begin{enumerate}
  \item 第一

  \item 第二
    \begin{itemize}
      \item 一个子列表

      \item 另一个子列表
    \end{itemize}

  \item 第三件事情
\end{enumerate}
\end{lstlisting}
效果如下图\ref{fig:列表}：
\begin{figure}[H]
    \centering
    \includegraphics[width=0.8\linewidth]{images/列表.png}
    \caption{生成列表}
    \label{fig:列表}
\end{figure}

\subsection{表格}
\LaTeX{}默认表格是一个没有横向和纵向分割线的，如果我们需要就得手动设定。我们可以用下面的代码创建一个表格：
\begin{lstlisting}
    \begin{tabular}{...}
\end{lstlisting}
\{...\}总会由定义的列的代码替换：
\begin{itemize}
    \item \textbf{l} 表示一个左对齐的列；
    \item \textbf{r} 表示一个右对齐的列；
    \item \textbf{c} 表示一个向中对齐的列；
    \item \textbf{|} 表示一个列的竖线；
\end{itemize}
例如，\texttt{\{lll\}}会生成一个三列的表格，并且保存向左对齐，没有显式的竖线；
\texttt{\{|l|l|r\}}会生成一个三列表格，前两列向左对齐，最后一列向右对齐，并且相邻两列之间有显式的竖线。

表格的数据在\texttt{tabular}后输入：
\begin{itemize}
    \item \textbf{\&}用于分割列；
    \item \textbf{\textbackslash \textbackslash}用于换行；
    \item \textbf{\textbackslash hline} 表示会插入一个贯穿所有列的横着的分割线；
    \item \textbf{\textbackslash cline\{1-2\}} 会在第一列和第二列中插入一个横着的分割线。
\end{itemize}

\subsubsection{表格实践}
\begin{tabular}{r|l|l}
Item & Quanity & Price(\$)\\
\hline
Nails & 500 & 0.34\\
Wooden boards & 100 & 4.00\\
Bricks & 240 &11.50\\
\end{tabular}

\begin{tabular}{c|c|c|c}
 &Year\\
\cline{2-4}
City & 2006 & 2007 &2008\\
\hline
London & 45789 & 46551 & 51298\\
Berlin & 34549 & 32543 & 29870\\
Paris & 49835 & 51009 & 51970\\
\end{tabular}
% -----------------------------------BLOCKS DESIGN----------------------------------------
\section{git实例}
\subsection{将历史信息可视化并进行探索}
在对应的git页面获得复制地址，即\texttt{https://github.com/missing-semester-cn/missing-semester-cn.github.io.git}
在我们的电脑中找一个合适的位置，打开cmd然后输入下面的指令：
\begin{lstlisting}
    git clone https://github.com/missing-semester-cn/missing-semester-cn.github.io.git
\end{lstlisting}
然后在下载好的文件夹中再打开cmd输入下面的指令：
\begin{lstlisting}
    git log .\README.md
\end{lstlisting}
结果如图\ref{fig:git log}：
\begin{figure}[H]
    \centering
    \includegraphics[width=0.5\linewidth]{images/readme.png}
    \caption{git log .\textbackslash README.md}
    \label{fig:git log}
\end{figure}
从这我们可以看出最后修改READ.md文件的是\textbf{Zhenger233 <2042712521@qq.com>},时间是\textbf{Fri Nov 15 00:01:20 2024 +0800}
接着输入：
\begin{lstlisting}
    git blame _config.yml
\end{lstlisting}
然后找到包含collection的那一行的哈希值，这里的哈希值是\texttt{a88b4eac},于是我们接着输入下面的指令：
\begin{lstlisting}
    git show a88b4eac
\end{lstlisting}
完整结果如下图\ref{fig:git blame}和图\ref{fig:git show}：
\begin{figure}[htbp]
    \centering
    % 左边图片
    \begin{minipage}[t]{0.48\linewidth}
        \centering
        \includegraphics[width=\linewidth]{images/git_blame.png} % 替换为你的图片路径
        \captionof{figure}{git blame}
        \label{fig:git blame}
    \end{minipage}
    \hfill % 在两个 minipage 之间添加弹性间距
    % 右边图片
    \begin{minipage}[t]{0.48\linewidth}
        \centering
        \includegraphics[width=\linewidth]{images/git_show.png} % 替换为你的图片路径
        \captionof{figure}{git show}
        \label{fig:git show}
    \end{minipage}
    \label{fig:both}
\end{figure}

由此我们可知最后一次修改 \_config.yml 文件中 collections: 行时的提交信息是\textbf{Redo lectures as a collection}
\subsection{创建、提交和删除特定文件}
使用 Git 时的一个常见错误是提交本不应该由 Git 管理的大文件，或是将含有敏感信息的文件提交给 Git 。尝试向仓库中添加一个文件并添加提交信息，然后将其从历史中删除,过程如下：
\subsubsection{创建并提交一个文件}
在cmd中输入如下的指令：
\begin{lstlisting}
# 1. 创建一个模拟的敏感文件
echo "MY_SECRET_PASSWORD=very_bad_password_123" > secrets.txt
# 2. 将其添加到暂存区并提交
git add secrets.txt
git commit -m "Add configuration file (MISTAKE: contains password)"
# 查看提交历史，可以看到这个错误的提交
git log --oneline -1
\end{lstlisting}
这样我们就向仓库中提交了一个错误文件
\subsubsection{删除该文件}
在cmd中输入下面的这些命令：
\begin{lstlisting}
    pip install git-filter-repo #安装git filter-repo
    git filter-repo --path secrets.txt --invert-paths #从所有分支和标签的所有历史提交中删除 secrets.txt 文件并自动重写 HEAD 和引用。
\end{lstlisting}

具体结果如下图\ref{fig:删除文件}：
\begin{figure}[H]
    \centering
    \includegraphics[width=0.8\linewidth]{images/创建和删除文件.png}
    \caption{删除文件}
    \label{fig:删除文件}
\end{figure}

\subsection{git stash的用法}
\subsubsection{问题1：使用\texttt{git stash}会发生什么?}
执行\texttt{git stash}命令后：
\begin{itemize}
    \item \textbf{保存修改：}Git 会将你工作目录中所有已跟踪文件的当前修改（包括暂存区和非暂存区的修改）打包保存到一个特殊的“储藏栈”（stash stack）中。这个储藏是一个临时的、独立的提交对象，但它不会出现在你的主分支历史中。
    \item \textbf{回复工作目录：}Git 会将你的工作目录和暂存区回退到最近一次提交（即 HEAD）时的状态。简单说，你之前做的所有修改都“消失”了，工作目录变得“干净”。
    \item \textbf{创建存储记录：}这个被保存的修改集会作为一个新的“储藏”（stash）记录被推入储藏栈。你可以通过\texttt{git stash list}查看。
    
    总而言之：\texttt{git stash}会把当前未完成的公工作打包起来，让我们回到一个干净的状态去处理其他紧急的任务。
\end{itemize}
\subsubsection{问题2：当我们使用\texttt{git log --all --oneline}会显示什么？}
\begin{itemize}
    \item \texttt{git log}:会显示提交历史。
    \item \texttt{--online}:将每个提交显示为一行。
    \item \texttt{--all}:显示\textbf{所有}引用的历史。
\end{itemize}
\subsubsection{问题3：通过\texttt{git stash pop}命令来撤销\texttt{git stash}操作，什么时候会用到这一技巧？}
\texttt{git stash pop}的作用：
\begin{itemize}
    \item \textbf{应用}：尝试将最近一次的储藏中的修改重新应用到当前的工作目录和暂存区。
    \item \textbf{删除}：如果应用成功，Git就会自动将这个储藏从储藏栈中删除。
\end{itemize}
简而言之，我们可以把\texttt{git stash pop}操作看作是一次撤销或者恢复，它把之前收起来的修改又拿回来了，它常用于以下的场景：
\begin{itemize}
    \item \textbf{紧急修复}
    \item \textbf{切换上下文}
    \item \textbf{更新代码}
    \item \textbf{尝试不同的方案}
    \item \textbf{清理工作区进行测试}
\end{itemize}

\subsection{自定义快捷命令}
问题描述：\\
与其他的命令行工具一样，Git 也提供了一个名为 ~/.gitconfig 配置文件 (或 dotfile)。请在 ~/.gitconfig 中创建一个别名，使您在运行 git graph 时，您可以得到 git log --all --graph --decorate --oneline 的输出结果；

首先在我们的cmd中输入如下指令：
\begin{lstlisting}
git config --global alias.graph "log --all --graph --decorate --oneline"
\end{lstlisting}
\begin{itemize}
\item \texttt{git config}: Git 的配置命令。
\item \texttt{--global}: 表示修改全局配置文件 (~/.gitconfig)。
\item \texttt{alias.graph}: 创建一个名为 graph 的别名。
\item \texttt{"log --all --graph --decorate --oneline"}: 这是别名指向的实际 Git 命令。这里我们省略了开头的 git，因为 Git 会自动为别名加上。
\end{itemize}

接着，我们验证别名是否生效，在cmd中输入如下代码：
\begin{lstlisting}
    git graph
\end{lstlisting}
具体效果如下图\ref{fig:git graph}:
\begin{figure}[H]
    \centering
    \includegraphics[width=0.5\linewidth]{images/定义别名.png}
    \caption{git graph效果图}
    \label{fig:git graph}
\end{figure}

\subsection{git init和git clone（初始化和获取仓库）}
这两个指令是所有git操作的起点。\texttt{git init}用于创建一个全新的本地仓库，而\texttt{git clone}用于从远端服务器（如github、gitee）中复制一个已有的仓库。\\
实际应用如\ref{fig:git init and git clone}（这里我们拉取的仓库地址是\texttt{https://github.com/missing-semester-cn/missing-semester-cn.github.io.git,同时文件夹初始为空文件夹}）:
\begin{figure}[H]
    \centering
    \includegraphics[width=0.8\linewidth]{images/init_and_clone.png}
    \caption{git init 和 git clone的效果}
    \label{fig:git init and git clone}
\end{figure}
从图中我们可以看到原本为空的文件夹中多出了一个名为\texttt{.git}的隐藏文件夹以及我们从远端仓库中拉取的\texttt{missing-semester-cn.github.io}文件.

\subsection{\texttt{git add}（暂存更改）}
这是git“快照”机制的核心，它将工作目录中的修改暂存到一个中间区域，准备下一次的提交，他可以让我们\textbf{准确控制}哪些修改被包含到下一个提交中。\\
\begin{itemize}
    \item \texttt{git add file.txt}：将文件file.txt的修改加入到暂存区
    \item \texttt{git add .}：将当前目录下的所有以跟踪文件的修改和所有新文件加入暂存区。
\end{itemize}
\texttt{git add file.txt}操作如图\ref{fig:git_add_filename}\\
\texttt{gti add .}操作如图\ref{fig:git add .}
\begin{figure}[H]
    \centering
    \includegraphics[width=0.8\linewidth]{images/git_add_filename.png}
    \caption{git add filename}
    \label{fig:git_add_filename}
\end{figure}
\begin{figure}[H]
    \centering
    \includegraphics[width=0.8\linewidth]{images/git_add.png}
    \caption{git add .}
    \label{fig:git add .}
\end{figure}
\subsection{\texttt{git commit}（创建快照）}
这是创建版本历史记录的关键命令，它将暂存区内所有的内容打包成一个永久的快照，并记录下作者、时间、提交信息等元数据
输入如下指令：
\begin{lstlisting}
    git commit -m "一条描述性的信息"
\end{lstlisting}
这条指令的作用是创建一个提交并附带一条描述性的信息。
操作如图\ref{fig:git commit}
\begin{figure}
    \centering
    \includegraphics[width=0.8\linewidth]{images/commit.png}
    \caption{git commit}
    \label{fig:git commit}
\end{figure}
\subsection{\texttt{git status}（检查状态）}
这是日常使用中最频繁的命令之一，它会告诉我们仓库目前的状态，哪些文件被修改了但是为暂存，哪些文件已暂存但是未提交，是否有未跟踪的新文件，我们在哪个分支上等信息。\\
\texttt{git status}效果如图\ref{fig:git status}（这里修改了text1.txt文件）
\begin{figure}
    \centering
    \includegraphics[width=0.8\linewidth]{images/git_status.png}
    \caption{git status}
    \label{fig:git status}
\end{figure}
\subsection{\texttt{git checkout /git switch}和\texttt{git branch}（分支管理）}
分支是git中强大功能的核心。它允许我们在同一个代码库中并行开发不同的鄂功能、修复bug或者进行测试，而不会相互干扰。\\
具体命令如下：
\begin{itemize}
    \item \texttt{git branch feature/login}:创建一个名为\texttt{feature/login}的新分支。
    \item \texttt{git checkout feature/login}或者\texttt{git switch feature/login}:切换到\texttt{feature/login}分支进行开发。
    \item \texttt{git checkout main}然后\texttt{git merge feature/login}：切换会主分支并将功能分支合并。
\end{itemize}
具体操作如图\ref{fig:feature分支}、\ref{fig:master分支}和\ref{fig:合并操作}：
\begin{figure}[htbp]
    \centering
    % 左边图片
    \begin{minipage}[t]{0.48\linewidth}
        \centering
        \includegraphics[width=\linewidth]{images/feature分支.png} % 替换为你的图片路径
        \captionof{figure}{部分操作和feature/login分支}
        \label{fig:feature分支}
    \end{minipage}
    \hfill % 在两个 minipage 之间添加弹性间距
    % 右边图片
    \begin{minipage}[t]{0.48\linewidth}
        \centering
        \includegraphics[width=\linewidth]{images/master分支.png} % 替换为你的图片路径
        \captionof{figure}{部分操作和master分支}
        \label{fig:master分支}
    \end{minipage}
    \label{fig:both}
\end{figure}
\begin{figure}[H]
    \centering
    \includegraphics[width=0.8\linewidth]{images/合并分支.png}
    \caption{合并操作}
    \label{fig:合并操作}
\end{figure}
在切换到feature/login分支后我新建了一个feature.txt文件，然后再切换到master分支上，我们观察图\ref{fig:feature分支}到图\ref{fig:master分支}，会发现master分支少了一个feature.txt文件，然后使用合并命令，这个时候图\ref{fig:合并操作}的文件夹中又出现了feature.txt文件。

\subsection{\texttt{git dif}（查看差异）}
这个命令用于精准查看代码的具体变化，它显示不同状态之间的差异。
\begin{itemize}
    \item \texttt{git diff}：显示工作目录中已修改但是未暂存（或最近一次提交）之间的差异。如图\ref{fig：git diff}所示，我在file.txt和text1.txt两个文件中增加了git diff字样。
    \item \texttt{git diff --cached}:显示暂存区中文件与最近一次提交之间的差异，即“\texttt{git commit}”时会提交什么内容。如图\ref{fig:git diff --cached}所示，我首先使用\texttt{git add .}命令，将所以已修改文件暂存，然后使用\texttt{git diff --cached}命令查看。
    \item \texttt{git diff HEAD~1 HEAD}:显示最近一次的提交和上一次提交（HEAD~1）之间的差异。如图\ref{fig:两次提交之间的差异}
    \item \texttt{git diff branch1..branch2}：显示\texttt{branch1}和\texttt{branch2}两个分支之间的差异。如图\ref{fig:两个分支之间的差异}
\end{itemize}
\begin{figure}[H]
    \centering
    \includegraphics[width=0.8\linewidth]{images/git_diff.png}
    \caption{git diff效果}
    \label{fig：git diff}
\end{figure}
\begin{figure}[H]
    \centering
    \includegraphics[width=0.8\linewidth]{images/git_diff_cached.png}
    \caption{git diff --cached效果}
    \label{fig:git diff --cached}
\end{figure}
\begin{figure}[H]
    \centering
    \includegraphics[width=0.8\linewidth]{images/两次提交之间的差异.png}
    \caption{两次提交之间的差异}
    \label{fig:两次提交之间的差异}
\end{figure}
\begin{figure}[H]
    \centering
    \includegraphics[width=0.8\linewidth]{images/两个分支之间的差异.png}
    \caption{两个分支之间的差异}
    \label{fig:两个分支之间的差异}
\end{figure}
\section{心得体会}
本次“系统开发工具基础”实验，我深入学习了 \LaTeX{} 和 Git 这两项在软件开发和学术写作中至关重要的工具。

\LaTeX{}在 LaTeX 部分，我从文档的基本结构开始，逐步掌握了如何添加文档标题、划分章节、创建标签引用、生成目录以及调整字体样式和大小。印象最深刻的是 \LaTeX{}在排版上的强大能力和灵活性。通过 \textbackslash documentclass、\textbackslash usepackage{ctex} 等命令，我能够轻松实现专业的文档布局，尤其是在处理中文字体和生成精确目录方面，\LaTeX{} 的表现令人满意。虽然初次接触时需要记忆较多的命令和语法，但其“所思即所得”的理念，使得最终文档的呈现效果远超传统文字处理器。学会使用 \textbackslash label 和 \textbackslash ref 进行交叉引用，也极大地提高了文档的组织性和可维护性。

由于本次实验报告是由\LaTeX{}编写的，所以我在这个过程中遇到了很多的问题。最让我头疼的就是各种命令前的\textbackslash 和\{\}这两个符号在\LaTeX{}中无法直接打出来，而我们本次的实验报告很多命令都包含这两个字符，每次打错都会导致编译出现问题，当然经过时间的沉淀和训练的增加这个问题出现的几率越来越低。其次就是图片的位置，在最开始的时候我发现我的图片和文字的位置并不是按照我在原始代码中写的那样，图片经常到处跑。最后我去查阅官方的网站，求助Ai才发现这是因为\LaTeX{}中的图片是float的也是就是浮动的，最后我找到固定图片的方法就是使用\texttt{\textbackslash begin{figure}}[H]，也就是在原命令的后面加上一个[H]。

此外和markdown以及word等两个我常用的文本编辑比较，我发现\LaTeX{}相较于markdown更加复杂更加的严谨，功能更多，这在最开始的时候对我来说简直是一个灾难，编写章节\ref{文档标题}和\ref{sub:章节}就花费了我两个小时的时间，虽然最后熟悉了之后效率显著提升。然后对比word我则觉得\LaTeX{}比word更加的专业也更加适合我们计算机专业的学生，它没有那么多花里胡哨的功能，我们不用去导航栏里找来找去，一切都和我们编写程序一下，通过输入指令来达到我们的要求。\LaTeX{}一个更适合计算机专业宝宝体质的专业文档编辑器。

Git 实践则让我对版本控制有了更直观和深刻的理解。我学习了如何初始化和克隆仓库 (git init, git clone)，管理文件修改 (git add, git commit)，以及查看项目历史 (git log, git show, git blame)。通过 git stash 命令，我体验了如何临时保存工作进度，以便切换任务或处理紧急bug。分支管理 (git branch, git checkout/switch, git merge) 的实践让我理解了团队协作中并行开发的重要性，以及如何安全地合并不同功能。git diff 命令则让我能精准地追踪代码变化，这对于调试和代码审查都非常有帮助。通过将敏感文件从历史中删除的实践，我也认识到了版本控制中安全性和规范操作的重要性。

这次实验不仅让我掌握了\LaTeX{} 和 Git 的基本操作，更重要的是，它培养了我对文档管理和代码版本控制的严谨态度。这些技能将对我未来的学术研究和软件开发工作产生深远的影响。通过实践，我体会到了这些工具带来的效率提升和项目可控性，未来我将继续深入学习和应用它们。
% -----------------------------------REFERENCE---------------------------------------
\end{document}